package cd.algorithm;

/**
 * Created by tecsun on 2016/9/26.
 */
public class CheckSum {
    /**
     * 生成16进制累加和校验码
     *
     * @param data 除去校验位的数据
     * @return
     */
    public static String makeChecksum(String data) {
        if (data==null||data=="") {
            return "";
        }
        int total = 0;
        int len = data.length();
        int num = 0;
        while (num < len) {
            String s = data.substring(num, num + 2);
            System.out.println(s);
            total += Integer.parseInt(s, 16);
            num = num + 2;
        }
        /**
         * 用256求余最大是255，即16进制的FF
         */
        int mod = total % 256;
        String hex = Integer.toHexString(mod);
        len = hex.length();
        //如果不够校验位的长度，补0,这里用的是两位校验
        if (len < 2) {
            hex = "0" + hex;
        }
        return hex;
    }

    /**
     * 16进制累加和校验
     *
     * @param data 除去校验位的数据
     * @param sign 校验位的数据
     * @return
     */
    public static boolean checkChecksum(String data, String sign) {
        // String sourceData="0100150aa303b101b201b301b404b504b601b904ba03be0140";
        //data="0100150aa303b101b201b301b404b504b601b904ba03be01";
        //sign="40";
        if (data==null||data=="" || sign==null||sign=="") {
            return false;
        }
        String checksum = makeChecksum(data);
        if (checksum.equals(sign)) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * 16进制累加和校验
     *
     * @param data 除去校验位的数据
     * @param sign 校验位的数据
     * @return
     */
    public static boolean checkChecksum(int[] data, int sign) {
    	int total = 0;
    	for(int temp : data){
    		total = total + temp;
    	}
    	/**
         * 用256求余最大是255，即16进制的FF
         */
        int mod = total % 256;
        if(sign == mod){
        	return true;
        }
        return false;
    }
}
